diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index af1d51e435..d01853d13d 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -907,6 +907,11 @@ class Order(LockModel, LoggedModel): return self.expires expires = self.expires.date() + timedelta(days=delay) + if self.event.settings.get('payment_term_weekdays'): + if expires.weekday() == 5: + expires += timedelta(days=2) + elif expires.weekday() == 6: + expires += timedelta(days=1) tz = ZoneInfo(self.event.settings.timezone) expires = make_aware(datetime.combine( diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index bd8d2f28b5..0fa4af05c6 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -941,9 +941,9 @@ DEFAULTS = { 'form_kwargs': dict( label=_('Expiration delay'), help_text=_("The order will only actually expire this many days after the expiration date communicated " - "to the customer. However, this will not delay beyond the \"last date of payments\" " - "configured above, which is always enforced. The delay may also end on a weekend regardless " - "of the other settings above."), + "to the customer. If you select \"Only end payment terms on weekdays\" above, this will also " + "be respected. However, this will not delay beyond the \"last date of payments\" " + "configured above, which is always enforced."), # Every order in between the official expiry date and the delayed expiry date has a performance penalty # for the cron job, so we limit this feature to 30 days to prevent arbitrary numbers of orders needing # to be checked. diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index fcf19c6450..35bf3c8116 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -783,8 +783,8 @@ class MailSettingsRendererPreview(MailSettingsPreview): return ctx def get(self, request, *args, **kwargs): - v = str(request.event.settings.mail_text_order_placed) - v = format_map(v, self.placeholders('mail_text_order_placed')) + v = str(request.event.settings.mail_text_order_payment_failed) + v = format_map(v, self.placeholders('mail_text_order_payment_failed')) renderers = request.event.get_html_mail_renderers() if request.GET.get('renderer') in renderers: with rolledback_transaction(): diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 8745697a27..7edc74ab6f 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -412,6 +412,7 @@ def test_expiring_auto_disabled(event): def test_expiring_auto_delayed(event): event.settings.set('payment_term_expire_delay_days', 3) event.settings.set('payment_term_last', date(2023, 7, 2)) + event.settings.set('payment_term_weekdays', False) event.settings.set('timezone', 'Europe/Berlin') o1 = Order.objects.create( code='FOO', event=event, email='dummy@dummy.test', @@ -458,6 +459,21 @@ def test_expiring_auto_delayed(event): assert o2.status == Order.STATUS_EXPIRED +@pytest.mark.django_db +def test_expiring_auto_delayed_weekdays(event): + event.settings.set('payment_term_expire_delay_days', 2) + event.settings.set('payment_term_weekdays', True) + event.settings.set('timezone', 'Europe/Berlin') + o1 = Order.objects.create( + code='FOO', event=event, email='dummy@dummy.test', + status=Order.STATUS_PENDING, + datetime=datetime(2023, 6, 22, 12, 13, 14, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")), + expires=datetime(2023, 6, 30, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")), + total=0, + ) + assert o1.payment_term_expire_date == o1.expires + timedelta(days=3) + + @pytest.mark.django_db def test_do_not_expire_if_approval_pending(event): o1 = Order.objects.create(