Compare commits

..

21 Commits

Author SHA1 Message Date
Raphael Michel
d0d7670ca5 Data sync: Allow more flexibility on list separators (#5718) 2025-12-17 16:23:07 +01:00
Richard Schreiber
a17a098b15 Exclude data-dir from code style checks (#5725) 2025-12-17 16:22:42 +01:00
sandra r
40516ab8e0 Translations: Update Galician
Currently translated at 15.9% (983 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
sandra r
3ca343fabc Translations: Update Galician
Currently translated at 15.9% (982 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
7304b7f24b Translations: Update Albanian
Currently translated at 91.3% (232 of 254 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
abaf968103 Translations: Update Albanian
Currently translated at 1.1% (71 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
86e2f5a155 Translations: Update Albanian
Currently translated at 69.6% (177 of 254 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
4c64af02c1 Translations: Update Albanian
Currently translated at 0.8% (52 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Phin Wolkwitz
11df4398e1 Fix presale date display in calendar (Z#23216645) (#5710)
Fix presale date display in calendar and introduce a template tag
2025-12-17 16:18:59 +01:00
Lukas Bockstaller
2e89fc0a94 Questions: filter answers by dateFrame (Z#23216406) (#5706)
* replace manual form with QuestionFilterForm

* move form to form/item.py

* filter using a dateFrameField

* rename QuestionFilterForm to QuestionAnswerFilterForm

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

* pass existing `opqs` into `filter_qs`

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

* clean up filters

* fix view errors

* add labels

* display validation failures on field/label

* fix linting issues

* adjust datetime comparisons from lte to lt & gte to gt

* Change filter-form layout similar to order-filter-form

* improve label texts

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

* use order constants

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

* use Order Constants in Form where possible

* Change phrasing from Subevent to Date

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

* include product variations in products filter

* repair time zone comparisons

* fix linting

* move filter form to form/filter.py

* remove references to timezone.utc

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

* remove manual class statements

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

* removes unnecessary check

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

* fix datetime comparison

* Add full stop to error message to match style

* unify var-names and code-indent

---------

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2025-12-15 12:46:06 +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
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
35 changed files with 2663 additions and 580 deletions

View File

@@ -90,6 +90,7 @@ StaticMapping = namedtuple('StaticMapping', ('id', 'pretix_model', 'external_obj
class OutboundSyncProvider:
max_attempts = 5
list_field_joiner = "," # set to None to keep native lists in properties
def __init__(self, event):
self.event = event
@@ -281,7 +282,8 @@ class OutboundSyncProvider:
'Please update value mapping for field "{field_name}" - option "{val}" not assigned'
).format(field_name=key, val=val)])
val = ",".join(val)
if self.list_field_joiner:
val = self.list_field_joiner.join(val)
return val
def get_properties(self, inputs: dict, property_mappings: List[dict]):

View File

@@ -71,15 +71,20 @@ def assign_properties(
return out
def _add_to_list(out, field_name, current_value, new_item, list_sep):
new_item = str(new_item)
def _add_to_list(out, field_name, current_value, new_item_input, list_sep):
if list_sep is not None:
new_item = new_item.replace(list_sep, "")
new_items = str(new_item_input).split(list_sep)
current_value = current_value.split(list_sep) if current_value else []
elif not isinstance(current_value, (list, tuple)):
else:
new_items = [str(new_item_input)]
if not isinstance(current_value, (list, tuple)):
current_value = [str(current_value)]
new_list = list(current_value)
for new_item in new_items:
if new_item not in current_value:
new_list = current_value + [new_item]
new_list.append(new_item)
if new_list != current_value:
if list_sep is not None:
new_list = list_sep.join(new_list)
out[field_name] = new_list

View File

@@ -541,7 +541,7 @@ class CartManager:
else:
raise e
def _extend_expired_positions(self):
def extend_expired_positions(self):
requires_seat = Exists(
SeatCategoryMapping.objects.filter(
Q(product=OuterRef('item'))
@@ -607,7 +607,7 @@ class CartManager:
self._check_item_constraints(op)
if cp.voucher:
self._voucher_use_diff[cp.voucher] += 1
self._voucher_use_diff[cp.voucher] += 2
self._operations.append(op)
return err
@@ -1449,7 +1449,7 @@ class CartManager:
self._check_max_cart_size()
err = self._delete_out_of_timeframe()
err = self._extend_expired_positions() or err
err = self.extend_expired_positions() or err
err = err or self._check_min_per_voucher()
self._extend_expiry_of_valid_existing_positions()

View File

@@ -0,0 +1,65 @@
#
# 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 datetime import datetime
from django import template
from django.utils.html import format_html
from django.utils.timezone import get_current_timezone
from pretix.base.i18n import LazyExpiresDate
from pretix.helpers.templatetags.date_fast import date_fast
register = template.Library()
@register.simple_tag
def html_time(value: datetime, dt_format: str = "SHORT_DATE_FORMAT", **kwargs):
"""
Building a <time datetime='{html-datetime}'>{human-readable datetime}</time> html string,
where the html-datetime as well as the human-readable datetime can be set
to a value from django's FORMAT_SETTINGS or "format_expires".
If attr_fmt isnt provided, it will be set to isoformat.
Usage example:
{% html_time event_start "SHORT_DATETIME_FORMAT" %}
or
{% html_time event_start "TIME_FORMAT" attr_fmt="H:i" %}
"""
if value in (None, ''):
return ''
value = value.astimezone(get_current_timezone())
attr_fmt = kwargs["attr_fmt"] if kwargs else None
try:
if not attr_fmt:
date_html = value.isoformat()
else:
date_html = date_fast(value, attr_fmt)
if dt_format == "format_expires":
date_human = LazyExpiresDate(value)
else:
date_human = date_fast(value, dt_format)
return format_html("<time datetime='{}'>{}</time>", date_html, date_human)
except AttributeError:
return ''

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']

View File

@@ -61,6 +61,10 @@ from pretix.base.models import (
SubEvent, SubEventMetaValue, Team, TeamAPIToken, TeamInvite, Voucher,
)
from pretix.base.signals import register_payment_providers
from pretix.base.timeframes import (
DateFrameField,
resolve_timeframe_to_datetime_start_inclusive_end_exclusive,
)
from pretix.control.forms import SplitDateTimeField
from pretix.control.forms.widgets import Select2, Select2ItemVarQuota
from pretix.control.signals import order_search_filter_q
@@ -1219,6 +1223,129 @@ class OrderPaymentSearchFilterForm(forms.Form):
return qs
class QuestionAnswerFilterForm(forms.Form):
STATUS_VARIANTS = [
("", _("All orders")),
(Order.STATUS_PAID, _("Paid")),
(Order.STATUS_PAID + 'v', _("Paid or confirmed")),
(Order.STATUS_PENDING, _("Pending")),
(Order.STATUS_PENDING + Order.STATUS_PAID, _("Pending or paid")),
("o", _("Pending (overdue)")),
(Order.STATUS_EXPIRED, _("Expired")),
(Order.STATUS_PENDING + Order.STATUS_EXPIRED, _("Pending or expired")),
(Order.STATUS_CANCELED, _("Canceled"))
]
status = forms.ChoiceField(
choices=STATUS_VARIANTS,
required=False,
label=_("Order status"),
)
item = forms.ChoiceField(
choices=[],
required=False,
label=_("Products"),
)
subevent = forms.ModelChoiceField(
queryset=SubEvent.objects.none(),
required=False,
empty_label=pgettext_lazy('subevent', 'All dates'),
label=pgettext_lazy("subevent", "Date"),
)
date_range = DateFrameField(
required=False,
include_future_frames=True,
label=_('Event date'),
)
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
super().__init__(*args, **kwargs)
self.initial['status'] = Order.STATUS_PENDING + Order.STATUS_PAID
choices = [('', _('All products'))]
for i in self.event.items.prefetch_related('variations').all():
variations = list(i.variations.all())
if variations:
choices.append((str(i.pk), _('{product} Any variation').format(product=str(i))))
for v in variations:
choices.append(('%d-%d' % (i.pk, v.pk), '%s %s' % (str(i), v.value)))
else:
choices.append((str(i.pk), str(i)))
self.fields['item'].choices = choices
if self.event.has_subevents:
self.fields["subevent"].queryset = self.event.subevents.all()
self.fields['subevent'].widget = Select2(
attrs={
'data-model-select2': 'event',
'data-select2-url': reverse('control:event.subevents.select2', kwargs={
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
'data-placeholder': pgettext_lazy('subevent', 'All dates')
}
)
self.fields['subevent'].widget.choices = self.fields['subevent'].choices
else:
del self.fields['subevent']
def clean(self):
cleaned_data = super().clean()
subevent = cleaned_data.get('subevent')
date_range = cleaned_data.get('date_range')
if subevent is not None and date_range is not None:
d_start, d_end = resolve_timeframe_to_datetime_start_inclusive_end_exclusive(now(), date_range, self.event.timezone)
if (
(d_start and not (d_start <= subevent.date_from)) or
(d_end and not (subevent.date_from < d_end))
):
self.add_error('subevent', pgettext_lazy('subevent', "Date doesn't start in selected date range."))
return cleaned_data
def filter_qs(self, opqs):
fdata = self.cleaned_data
subevent = fdata.get('subevent', None)
date_range = fdata.get('date_range', None)
if subevent is not None:
opqs = opqs.filter(subevent=subevent)
if date_range is not None:
d_start, d_end = resolve_timeframe_to_datetime_start_inclusive_end_exclusive(now(), date_range, self.event.timezone)
opqs = opqs.filter(
subevent__date_from__gte=d_start,
subevent__date_from__lt=d_end
)
s = fdata.get("status", Order.STATUS_PENDING + Order.STATUS_PAID)
if s != "":
if s == Order.STATUS_PENDING:
opqs = opqs.filter(order__status=Order.STATUS_PENDING,
order__expires__lt=now().replace(hour=0, minute=0, second=0))
elif s == Order.STATUS_PENDING + Order.STATUS_PAID:
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
elif s == Order.STATUS_PAID + 'v':
opqs = opqs.filter(
Q(order__status=Order.STATUS_PAID) |
Q(order__status=Order.STATUS_PENDING, order__valid_if_pending=True)
)
elif s == Order.STATUS_PENDING + Order.STATUS_EXPIRED:
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
else:
opqs = opqs.filter(order__status=s)
if s not in (Order.STATUS_CANCELED, ""):
opqs = opqs.filter(canceled=False)
if fdata.get("item", "") != "":
i = fdata.get("item", "")
opqs = opqs.filter(item_id__in=(i,))
return opqs
class SubEventFilterForm(FilterForm):
orders = {
'date_from': 'date_from',

View File

@@ -20,33 +20,18 @@
</div>
<form class="panel-body filter-form" action="" method="get">
<div class="row">
<div class="col-lg-2 col-sm-6 col-xs-6">
<select name="status" class="form-control">
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option>
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option>
<option value="pv" {% if request.GET.status == "pv" %}selected="selected"{% endif %}>{% trans "Paid or confirmed" %}</option>
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option>
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
</select>
<div class="col-md-2 col-xs-6">
{% bootstrap_field form.status %}
</div>
<div class="col-lg-5 col-sm-6 col-xs-6">
<select name="item" class="form-control">
<option value="">{% trans "All products" %}</option>
{% for item in items %}
<option value="{{ item.id }}"
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
{{ item.name }}
</option>
{% endfor %}
</select>
<div class="col-md-3 col-xs-6">
{% bootstrap_field form.item %}
</div>
{% if request.event.has_subevents %}
<div class="col-lg-5 col-sm-6 col-xs-6">
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
{% if has_subevents %}
<div class="col-md-3 col-xs-6">
{% bootstrap_field form.subevent %}
</div>
<div class="col-md-4 col-xs-6">
{% bootstrap_field form.date_range %}
</div>
{% endif %}
</div>

View File

@@ -65,7 +65,7 @@ from pretix.api.serializers.item import (
)
from pretix.base.forms import I18nFormSet
from pretix.base.models import (
CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation, Order,
CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation,
OrderPosition, Question, QuestionAnswer, QuestionOption, Quota,
SeatCategoryMapping, Voucher,
)
@@ -74,6 +74,7 @@ from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
from pretix.base.services.quotas import QuotaAvailability
from pretix.base.services.tickets import invalidate_cache
from pretix.base.signals import quota_availability
from pretix.control.forms.filter import QuestionAnswerFilterForm
from pretix.control.forms.item import (
CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm,
ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm,
@@ -660,46 +661,26 @@ class QuestionMixin:
return ctx
class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingView, DetailView):
class QuestionView(EventPermissionRequiredMixin, ChartContainingView, DetailView):
model = Question
template_name = 'pretixcontrol/items/question.html'
permission = 'can_change_items'
template_name_field = 'question'
@cached_property
def filter_form(self):
return QuestionAnswerFilterForm(event=self.request.event, data=self.request.GET)
def get_answer_statistics(self):
opqs = OrderPosition.objects.filter(
order__event=self.request.event,
)
if self.filter_form.is_valid():
opqs = self.filter_form.filter_qs(opqs)
qs = QuestionAnswer.objects.filter(
question=self.object, orderposition__isnull=False,
)
if self.request.GET.get("subevent", "") != "":
opqs = opqs.filter(subevent=self.request.GET["subevent"])
s = self.request.GET.get("status", "np")
if s != "":
if s == 'o':
opqs = opqs.filter(order__status=Order.STATUS_PENDING,
order__expires__lt=now().replace(hour=0, minute=0, second=0))
elif s == 'np':
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
elif s == 'pv':
opqs = opqs.filter(
Q(order__status=Order.STATUS_PAID) |
Q(order__status=Order.STATUS_PENDING, order__valid_if_pending=True)
)
elif s == 'ne':
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
else:
opqs = opqs.filter(order__status=s)
if s not in (Order.STATUS_CANCELED, ""):
opqs = opqs.filter(canceled=False)
if self.request.GET.get("item", "") != "":
i = self.request.GET.get("item", "")
opqs = opqs.filter(item_id__in=(i,))
qs = qs.filter(orderposition__in=opqs)
op_cnt = opqs.filter(item__in=self.object.items.all()).count()
@@ -746,9 +727,11 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['items'] = self.object.items.all()
ctx['items'] = self.object.items.exists()
ctx['has_subevents'] = self.request.event.has_subevents
stats = self.get_answer_statistics()
ctx['stats'], ctx['total'] = stats
ctx['form'] = self.filter_form
return ctx
def get_object(self, queryset=None) -> Question:

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-05 18:00+0000\n"
"PO-Revision-Date: 2025-12-15 20:00+0000\n"
"Last-Translator: sandra r <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/"
"gl/>\n"
@@ -6506,7 +6506,6 @@ msgstr "pendiente"
#: pretix/base/models/orders.py:203 pretix/base/payment.py:570
#: pretix/base/services/invoices.py:581
#, fuzzy
msgid "paid"
msgstr "pagado"
@@ -6840,9 +6839,8 @@ msgid "This reference will be printed on your invoice for your convenience."
msgstr "Esta referencia imprimirase na súa factura para a súa conveniencia."
#: pretix/base/models/orders.py:3534
#, fuzzy
msgid "Transmission type"
msgstr "digo de transacción"
msgstr "Medio de contacto"
#: pretix/base/models/orders.py:3632
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9
@@ -9295,10 +9293,10 @@ msgid "Your exported data exceeded the size limit for scheduled exports."
msgstr ""
#: pretix/base/services/invoices.py:116
#, fuzzy, python-brace-format
#, python-brace-format
msgctxt "invoice"
msgid "Please complete your payment before {expire_date}."
msgstr "Por favor complete su pago antes de {expire_date}."
msgstr "Complete o seu pago antes de {expire_date}."
#: pretix/base/services/invoices.py:128
#, python-brace-format
@@ -21609,9 +21607,8 @@ msgid "Placed order"
msgstr "Pedido realizado"
#: pretix/control/templates/pretixcontrol/event/mail.html:93
#, fuzzy
msgid "Paid order"
msgstr "Orden de pago"
msgstr "Pedido pagado"
#: pretix/control/templates/pretixcontrol/event/mail.html:96
msgid "Free order"
@@ -24216,9 +24213,8 @@ msgstr "Sí, aprobar la orden"
#: pretix/control/templates/pretixcontrol/order/index.html:166
#: pretix/presale/templates/pretixpresale/event/order.html:483
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:7
#, fuzzy
msgid "Cancel order"
msgstr "Cancelar orden"
msgstr "Cancelar a orde"
#: pretix/control/templates/pretixcontrol/order/cancel.html:12
#: pretix/control/templates/pretixcontrol/order/deny.html:11
@@ -24978,9 +24974,8 @@ msgstr "Cambiar"
#: pretix/control/templates/pretixcontrol/order/index.html:1034
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90
#: pretix/presale/templates/pretixpresale/event/order.html:318
#, fuzzy
msgid "ZIP code and city"
msgstr "Código postal y ciudad"
msgstr "Código postal e cidade"
#: pretix/control/templates/pretixcontrol/order/index.html:1047
#, fuzzy
@@ -25437,9 +25432,8 @@ msgid "Preview refund amount"
msgstr "Reembolso"
#: pretix/control/templates/pretixcontrol/orders/cancel.html:88
#, fuzzy
msgid "Cancel all orders"
msgstr "Cancelar orden"
msgstr "Cancelar todos os pedidos"
#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:13
#, fuzzy
@@ -33254,9 +33248,8 @@ msgid "Payment reversed."
msgstr "Pago anulado."
#: pretix/plugins/paypal2/signals.py:62
#, fuzzy
msgid "Payment pending."
msgstr "Pago pendiente."
msgstr "Pago pendente."
#: pretix/plugins/paypal2/signals.py:63
#, fuzzy
@@ -33398,9 +33391,8 @@ msgstr "Por favor, inténtalo de nuevo."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57
#, fuzzy
msgid "Please select how you want to pay."
msgstr "Por favor, seleccione cómo desea pagar."
msgstr "Por favor, seleccione cómo desexa pagar."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html:10
#, fuzzy
@@ -34550,7 +34542,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:337
msgid "Credit card payments"
msgstr "Pagos con cartón de crédito"
msgstr "Pagos con tarxeta de crédito"
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
msgid "iDEAL"
@@ -35103,18 +35095,12 @@ msgstr "Titular de la cuenta"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html:7
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html:13
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html:5
#, fuzzy
#| msgid ""
#| "After you submitted your order, we will redirect you to the payment "
#| "service provider to complete your payment. You will then be redirected "
#| "back here to get your tickets."
msgid ""
"After you submitted your order, we will redirect you to the payment service "
"provider to complete your payment. You will then be redirected back here."
msgstr ""
"Despois de que enviase o seu pedido, redirixirémoslle ao provedor de "
"servizos de pago para completar o seu pago. A continuación, redirixiráselle "
"de novo aquí para obter as súas entradas."
"Despois de enviar o teu pedido, redirixirémoste ao provedor de servizos de "
"pagamento para completar o pago. Despois, serás redirixido de novo aquí."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:9
msgid ""
@@ -35490,9 +35476,8 @@ msgid "Download tickets (PDF)"
msgstr "Descargar tickets (PDF)"
#: pretix/plugins/ticketoutputpdf/ticketoutput.py:66
#, fuzzy
msgid "Download ticket (PDF)"
msgstr "Descargar ticket"
msgstr "Descargar ticket (PDF)"
#: pretix/plugins/ticketoutputpdf/views.py:62
#, fuzzy
@@ -35631,7 +35616,6 @@ msgstr ""
"selecciona un método de pago."
#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:679
#, fuzzy
msgid "Please select a payment method."
msgstr "Por favor seleccione un método de pago."
@@ -36092,9 +36076,8 @@ msgid "Cart expired"
msgstr "O carro da compra caducou"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
#, fuzzy
msgid "Show full cart"
msgstr "Mostrar información"
msgstr "Mostrar o carro completo"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:52
#: pretix/presale/templates/pretixpresale/event/index.html:86
@@ -36186,9 +36169,8 @@ msgstr ""
"un enlace que puede utilizar para pagar."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:215
#, fuzzy
msgid "Place binding order"
msgstr "Colocar orden de compra"
msgstr "Realizar orde"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:217
msgid "Submit registration"
@@ -36787,9 +36769,9 @@ msgstr[0] "Unha entrada"
msgstr[1] "%(num)s entradas"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:485
#, fuzzy, python-format
#, python-format
msgid "incl. %(tax_sum)s taxes"
msgstr "incl. %(tax_sum)s impuestos"
msgstr "incl. %(tax_sum)s IVE"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505
#, python-format
@@ -37112,9 +37094,8 @@ msgid "Confirmed"
msgstr "Confirmado"
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:15
#, fuzzy
msgid "Payment pending"
msgstr "Pago pendiente"
msgstr "Pago pendente"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:21
#, fuzzy
@@ -37138,11 +37119,11 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288
#, fuzzy, python-format
#, python-format
msgid "%(amount)s× in your cart"
msgid_plural "%(amount)s× in your cart"
msgstr[0] "%(count)s elementos"
msgstr[1] "%(count)s elementos"
msgstr[0] "%(amount)s× no teu carro"
msgstr[1] "%(amount)s× no teu carro"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374
@@ -37373,9 +37354,9 @@ msgstr "O seu pedido foi procesado con éxito! Ver abaixo para máis detalles."
#: pretix/presale/templates/pretixpresale/event/order.html:19
#: pretix/presale/templates/pretixpresale/event/order.html:50
#, fuzzy
msgid "We successfully received your payment. See below for details."
msgstr "Hemos recibido con éxito su pago. Ver abajo para más detalles."
msgstr ""
"Recibimos o teu pagamento correctamente. Consulta os detalles a continuación."
#: pretix/presale/templates/pretixpresale/event/order.html:35
#, fuzzy
@@ -37396,24 +37377,18 @@ msgstr ""
"organizador del evento antes de que pueda pagar y completar este pedido."
#: pretix/presale/templates/pretixpresale/event/order.html:43
#, fuzzy
msgid "Please note that we still await your payment to complete the process."
msgstr "Tenga en cuenta que aún esperamos su pago para completar el proceso."
msgstr "Ten en conta que aínda agardamos o teu pago para completar o proceso."
#: 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, marque ou garde a ligazón a esta páxina exacta se desexa acceder "
"ao seu pedido máis tarde. Tamén lle enviamos un correo electrónico coa "
"ligazón ao enderezo que vostede especificou."
"Por favor, garda a ligazón a esta páxina exacta se queres acceder ao teu "
"pedido máis tarde. Tamén che enviamos un correo electrónico ao enderezo que "
"especificaches coa ligazón a esta páxina."
#: pretix/presale/templates/pretixpresale/event/order.html:59
#, fuzzy
@@ -37435,9 +37410,9 @@ msgid "View in backend"
msgstr "Ver en el backend"
#: pretix/presale/templates/pretixpresale/event/order.html:91
#, fuzzy, python-format
#, python-format
msgid "A payment of %(total)s is still pending for this order."
msgstr "Un pago de %(total)s todavía está pendiente para esta orden."
msgstr "Un pago de %(total)s aínda está pendente para esta orde."
#: pretix/presale/templates/pretixpresale/event/order.html:96
#, fuzzy, python-format
@@ -37546,10 +37521,9 @@ msgid "Change your order"
msgstr "Cancelar orden"
#: pretix/presale/templates/pretixpresale/event/order.html:358
#, fuzzy
msgctxt "action"
msgid "Cancel your order"
msgstr "Cancelar orden"
msgstr "Cancela o teu pedido"
#: pretix/presale/templates/pretixpresale/event/order.html:366
msgid ""
@@ -37665,9 +37639,9 @@ msgid "Request cancellation: %(code)s"
msgstr "Pedido cancelado: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:15
#, fuzzy, python-format
#, python-format
msgid "Cancel order: %(code)s"
msgstr "Cancelar orden: %(code)s"
msgstr "Cancelar orde: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:38
msgid ""
@@ -37753,14 +37727,12 @@ msgid "Modify order: %(code)s"
msgstr "Modificar pedido: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_modify.html:18
#, fuzzy
msgid ""
"Modifying your invoice address will not automatically generate a new "
"invoice. Please contact us if you need a new invoice."
msgstr ""
"La modificación de la dirección de facturación no generará automáticamente "
"una nueva factura. Póngase en contacto con nosotros si necesita una nueva "
"factura."
"A modificación do enderezo de facturación non xerará automaticamente unha "
"nova factura. Póñase en contacto connosco se precisa unha nova factura."
#: pretix/presale/templates/pretixpresale/event/order_modify.html:88
#: pretix/presale/templates/pretixpresale/event/position_modify.html:49
@@ -38609,10 +38581,8 @@ msgid "Your cart is now empty."
msgstr "Baleirouse o seu pedido."
#: pretix/presale/views/cart.py:569
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Your cart timeout was extended."
msgstr "O seu pedido actualizouse."
msgstr "Ampliouse o tempo de espera do teu carro."
#: pretix/presale/views/cart.py:584
msgid "The products have been successfully added to your cart."

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-09 07:09+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"
@@ -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
@@ -3398,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 ""
@@ -3412,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."
@@ -13205,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
@@ -17345,13 +17343,9 @@ 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
#, python-brace-format
@@ -33732,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."
@@ -34516,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
@@ -35608,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
@@ -35704,10 +35695,9 @@ 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
#, python-format
@@ -35715,10 +35705,8 @@ msgid "Valid until %(date)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

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,34 +8,36 @@ 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-14 00: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"
msgstr ""
msgstr "Gjermanisht"
#: pretix/_base_settings.py:89
msgid "German (informal)"
msgstr ""
msgstr "Gjermanisht (joformale)"
#: pretix/_base_settings.py:90
msgid "Arabic"
msgstr ""
msgstr "Arabisht"
#: pretix/_base_settings.py:91
msgid "Basque"
msgstr ""
msgstr "Baskisht"
#: pretix/_base_settings.py:92
msgid "Catalan"
@@ -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"
@@ -2952,7 +2954,7 @@ msgstr ""
#: pretix/plugins/reports/accountingreport.py:105
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:67
msgid "All"
msgstr ""
msgstr "Të gjitha"
#: pretix/base/exporters/orderlist.py:1329 pretix/control/forms/filter.py:1450
msgid "Live"
@@ -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 ""
@@ -7432,7 +7434,7 @@ msgstr ""
#: pretix/base/pdf.py:278 pretix/base/pdf.py:307
#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1271
msgid "Friday"
msgstr ""
msgstr "E Premte"
#: pretix/base/pdf.py:282
msgid "Event end date and time"
@@ -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"
@@ -8130,27 +8132,27 @@ msgstr ""
#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1267
msgid "Monday"
msgstr ""
msgstr "E Hënë"
#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1268
msgid "Tuesday"
msgstr ""
msgstr "E Martë"
#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1269
msgid "Wednesday"
msgstr ""
msgstr "E Mërkurë"
#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1270
msgid "Thursday"
msgstr ""
msgstr "E Enjte"
#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1272
msgid "Saturday"
msgstr ""
msgstr "E Shtunë"
#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1273
msgid "Sunday"
msgstr ""
msgstr "E Diel"
#: pretix/base/services/checkin.py:368
#, python-brace-format
@@ -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"
@@ -13042,7 +13044,7 @@ msgstr ""
#: pretix/control/forms/filter.py:2052 pretix/control/forms/filter.py:2054
#: pretix/control/forms/filter.py:2620 pretix/control/forms/filter.py:2622
msgid "Search query"
msgstr ""
msgstr "Kërkim"
#: pretix/control/forms/filter.py:1528 pretix/control/forms/filter.py:1600
#: pretix/control/templates/pretixcontrol/organizers/customer.html:47
@@ -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 ""
@@ -18272,7 +18274,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html:50
#: pretix/control/templates/pretixcontrol/organizers/logs.html:80
msgid "No results"
msgstr ""
msgstr "S'ka rezultate"
#: pretix/control/templates/pretixcontrol/event/mail.html:7
#: pretix/control/templates/pretixcontrol/organizers/mail.html:11
@@ -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
@@ -19324,51 +19326,51 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/global_sysreport.html:16
msgid "January"
msgstr ""
msgstr "Janar"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:17
msgid "February"
msgstr ""
msgstr "Shkurt"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:18
msgid "March"
msgstr ""
msgstr "Mars"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:19
msgid "April"
msgstr ""
msgstr "Prill"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:20
msgid "May"
msgstr ""
msgstr "Maj"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:21
msgid "June"
msgstr ""
msgstr "Qershor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:22
msgid "July"
msgstr ""
msgstr "Korrik"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:23
msgid "August"
msgstr ""
msgstr "Gusht"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:24
msgid "September"
msgstr ""
msgstr "Shtator"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:25
msgid "October"
msgstr ""
msgstr "Tetor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:26
msgid "November"
msgstr ""
msgstr "Nëntor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:27
msgid "December"
msgstr ""
msgstr "Dhjetor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:32
msgid "Generate report"
@@ -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"
@@ -20096,7 +20098,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/items/question.html:91
msgid "Count"
msgstr ""
msgstr "Sasia"
#: pretix/control/templates/pretixcontrol/items/question.html:92
#, python-format
@@ -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
@@ -23096,7 +23098,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/pdf/index.html:52
msgid "Text box"
msgstr ""
msgstr "Kutia teksti"
#: pretix/control/templates/pretixcontrol/pdf/index.html:59
msgid "QR Code"
@@ -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 ""
@@ -29757,7 +29765,7 @@ msgstr ""
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:23
msgid "Ticket design"
msgstr ""
msgstr "Dizajni i biletës"
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:27
msgid "You can modify the design after you saved this page."
@@ -30320,7 +30328,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:27
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18
msgid "Cart expired"
msgstr ""
msgstr "Shporta juaj u skadua"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
msgid "Show full cart"
@@ -30928,11 +30936,13 @@ msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Sendet në shportën tuaj nuk janë të rezervuar më për ju. Ju mund t'a "
"përmbushni porosinë tuaj derisa janë ende të disponueshëm."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
msgid "Renew reservation"
msgstr ""
msgstr "Rivendosni rezervimin"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526
msgid "Reservation renewed"
@@ -32444,7 +32454,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

File diff suppressed because it is too large Load Diff

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

@@ -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
@@ -440,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'),
@@ -1880,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

@@ -46,15 +46,17 @@ def register_payment_provider(sender, **kwargs):
from .payment import (
StripeAffirm, StripeAlipay, StripeBancontact, StripeCC, StripeEPS,
StripeGiropay, StripeIdeal, StripeKlarna, StripeMobilePay,
StripeMultibanco, StripePayByBank, 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, StripePayByBank, StripePayPal, StripeSwish, StripeTwint, StripeMobilePay
StripeSofort, StripeEPS, StripeMultibanco, StripePayByBank, StripePrzelewy24, StripePromptPay, StripeRevolutPay,
StripeWeChatPay, StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish,
StripeTwint, StripeMobilePay
]

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

@@ -27,10 +27,22 @@
<div class="stripe-errors sr-only panel-body">
</div>
<div class="panel-body embed-responsive embed-responsive-sca" id="scacontainer">
{% 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">
<a class="btn btn-block btn-default btn-lg"

View File

@@ -613,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,
@@ -631,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

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %}
{% load icon %}
{% load eventurl %}
@@ -21,20 +22,18 @@
{% if event.settings.show_times %}
<br>
<span data-time="{{ ev.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_from|date:"TIME_FORMAT" time_24=ev.date_from|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
{% html_time ev.date_from "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans with time=time %}
Begin: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% if event.settings.show_date_to and ev.date_to %}
<br>
<span data-time="{{ ev.date_to.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_to|date:"TIME_FORMAT" time_24=ev.date_to|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
{% html_time ev.date_to "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans with time=time %}
End: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% endif %}
{% endif %}
@@ -42,19 +41,17 @@
<br>
{% if ev.date_admission|date:"SHORT_DATE_FORMAT" == ev.date_from|date:"SHORT_DATE_FORMAT" %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_admission|date:"TIME_FORMAT" time_24=ev.date_admission|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
{% html_time ev.date_admission "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans trimmed with time=time %}
Admission: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% else %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with datetime_human=ev.date_admission|date:"SHORT_DATETIME_FORMAT" datetime_iso=ev.date_admission|time:"Y-m-d H:i" %}
{% blocktrans trimmed with datetime='<time datetime="'|add:datetime_iso|add:'">'|add:datetime_human|add:"</time>"|safe %}
{% html_time ev.date_admission "SHORT_DATETIME_FORMAT" attr_fmt="Y-m-d H:i" as datetime%}
{% blocktrans trimmed with datetime=datetime %}
Admission: {{ datetime }}
{% endblocktrans %}
{% endwith %}
</span>
{% endif %}
{% endif %}

View File

@@ -1,4 +1,5 @@
{% extends "pretixpresale/event/base.html" %}
{% load html_time %}
{% load i18n %}
{% load bootstrap3 %}
{% load eventsignal %}
@@ -92,11 +93,10 @@
A payment of {{ total }} is still pending for this order.
{% endblocktrans %}</strong>
<strong>
{% with date_human=order|format_expires|safe date_iso=order.expires|date:"c" %}
{% blocktrans trimmed with date='<time datetime="'|add:date_iso|add:'">'|add:date_human|add:"</time>"|safe %}
{% html_time order.expires "format_expires" as date %}
{% blocktrans trimmed with date=date %}
Please complete your payment before {{ date }}
{% endblocktrans %}
{% endwith %}
</strong>
</p>
{% if last_payment %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %}
{% load date_fast %}
{% load calendarhead %}
@@ -55,7 +56,7 @@
running
{% elif event.event.presale_has_ended %}
over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon
{% else %}
soon
@@ -108,13 +109,12 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %}
{% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span>
{% with date_human=event.event.presale_start|date_fast:"SHORT_DATE_FORMAT" date_iso=event.event.presale_start|date_fast:"c" %}
{% blocktrans with start_date="<time datetime='"|add:date_iso|add:"'>"|add:date_human|add:"</time>"|safe %}
{% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date=start_date %}
from {{ start_date }}
{% endblocktrans %}
{% endwith %}
{% else %}
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Soon" %}
{% endif %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %}
{% load eventurl %}
<div class="day-calendar cal-size-{{ raster_to_shortest_ratio }}{% if no_headlines %} no-headlines{% endif %}"
@@ -52,7 +53,7 @@
running
{% elif event.event.presale_has_ended %}
over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon
{% else %}
soon
@@ -114,9 +115,10 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %}
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span>
{% blocktrans with start_date=event.event.presale_start|date:"SHORT_DATE_FORMAT" %}
{% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date=start_date %}
from {{ start_date }}
{% endblocktrans %}
{% else %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %}
{% load icon %}
{% load textbubble %}
@@ -52,11 +53,10 @@
{% endtextbubble %}
{% if event.settings.presale_start_show_date %}
<br><span class="text-muted">
{% with date_iso=event.effective_presale_start.isoformat date_human=event.effective_presale_start|date:"SHORT_DATE_FORMAT" %}
{% blocktrans trimmed with date='<time datetime="'|add:date_iso|add:'">'|add:date_human|add:"</time>"|safe %}
{% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as date %}
{% blocktrans with date=date %}
Sale starts {{ date }}
{% endblocktrans %}
{% endwith %}
</span>
{% endif %}
{% endif %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %}
{% load date_fast %}
<div class="week-calendar">
@@ -24,7 +25,7 @@
running
{% elif event.event.presale_has_ended %}
over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon
{% else %}
soon
@@ -77,9 +78,10 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %}
{% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
{% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span>
{% blocktrans with start_date=event.event.presale_start|date_fast:"SHORT_DATE_FORMAT" %}
{% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date=start_date %}
from {{ start_date }}
{% endblocktrans %}
{% else %}

View File

@@ -471,10 +471,11 @@ class WidgetAPIProductList(EventListMixin, View):
availability['color'] = 'red'
availability['text'] = gettext('Sale over')
availability['reason'] = 'over'
elif event.settings.presale_start_show_date and ev.presale_start:
elif event.settings.presale_start_show_date and ev.effective_presale_start:
availability['color'] = 'orange'
availability['text'] = gettext('from %(start_date)s') % {
'start_date': date_format(ev.presale_start.astimezone(tz or event.timezone), "SHORT_DATE_FORMAT")
'start_date': date_format(ev.effective_presale_start.astimezone(tz or event.timezone),
"SHORT_DATE_FORMAT")
}
availability['reason'] = 'soon'
else:

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -1,7 +1,7 @@
[flake8]
ignore = N802,W503,E402,C901,E722,W504,E252,N812,N806,N818,E741
max-line-length = 160
exclude = migrations,.ropeproject,static,mt940.py,_static,build,make_testdata.py,*/testutils/settings.py,tests/settings.py,pretix/base/models/__init__.py,pretix/base/secretgenerators/pretix_sig1_pb2.py,.eggs/*
exclude = data/*,migrations,.ropeproject,static,mt940.py,_static,build,make_testdata.py,*/testutils/settings.py,tests/settings.py,pretix/base/models/__init__.py,pretix/base/secretgenerators/pretix_sig1_pb2.py,.eggs/*
max-complexity = 11
[isort]
@@ -13,7 +13,7 @@ extra_standard_library = typing,enum,mimetypes
multi_line_output = 5
line_length = 79
honor_noqa = true
skip_glob = make_testdata.py,wsgi.py,bootstrap,celery_app.py,pretix/settings.py,tests/settings.py,pretix/testutils/settings.py,.eggs/**
skip_glob = data/**,make_testdata.py,wsgi.py,bootstrap,celery_app.py,pretix/settings.py,tests/settings.py,pretix/testutils/settings.py,.eggs/**
[tool:pytest]
DJANGO_SETTINGS_MODULE = tests.settings

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

@@ -2709,6 +2709,7 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('0.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1
)
self.cm.extend_expired_positions()
self.cm.commit()
cp2.refresh_from_db()
assert cp2.expires > now()
@@ -2731,6 +2732,7 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('0.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1
)
self.cm.extend_expired_positions()
with self.assertRaises(CartError):
self.cm.commit()
assert CartPosition.objects.count() == 0
@@ -3398,6 +3400,7 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('12.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1
)
self.cm.extend_expired_positions()
self.cm.commit()
cp1.refresh_from_db()
cp2.refresh_from_db()
@@ -3408,12 +3411,13 @@ class CartAddonTest(CartTestMixin, TestCase):
@classscope(attr='orga')
def test_expand_expired_refresh_voucher(self):
v = Voucher.objects.create(item=self.ticket, value=Decimal('20.00'), event=self.event, price_mode='set',
valid_until=now() + timedelta(days=2), max_usages=1, redeemed=0)
valid_until=now() + timedelta(days=2), max_usages=999, redeemed=0)
cp1 = CartPosition.objects.create(
expires=now() - timedelta(minutes=10), max_extend=now() + 10 * self.cart_reservation_time,
item=self.ticket, price=Decimal('21.50'),
event=self.event, cart_id=self.session_key, voucher=v
)
self.cm.extend_expired_positions()
self.cm.commit()
cp1.refresh_from_db()
assert cp1.expires > now()