forked from CGM_Public/pretix_original
Refs #250 -- Keep payment deadlines on weekdays
This commit is contained in:
@@ -266,7 +266,15 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d
|
|||||||
total = sum([c.price for c in positions])
|
total = sum([c.price for c in positions])
|
||||||
payment_fee = payment_provider.calculate_fee(total)
|
payment_fee = payment_provider.calculate_fee(total)
|
||||||
total += payment_fee
|
total += payment_fee
|
||||||
expires = [now_dt + timedelta(days=event.settings.get('payment_term_days', as_type=int))]
|
|
||||||
|
exp_by_date = now_dt + timedelta(days=event.settings.get('payment_term_days', as_type=int))
|
||||||
|
if event.settings.get('payment_term_weekdays'):
|
||||||
|
if exp_by_date.weekday() == 5:
|
||||||
|
exp_by_date += timedelta(days=2)
|
||||||
|
elif exp_by_date.weekday() == 6:
|
||||||
|
exp_by_date += timedelta(days=1)
|
||||||
|
|
||||||
|
expires = [exp_by_date]
|
||||||
if event.settings.get('payment_term_last'):
|
if event.settings.get('payment_term_last'):
|
||||||
expires.append(event.settings.get('payment_term_last', as_type=datetime))
|
expires.append(event.settings.get('payment_term_last', as_type=datetime))
|
||||||
order = Order.objects.create(
|
order = Order.objects.create(
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ DEFAULTS = {
|
|||||||
'default': None,
|
'default': None,
|
||||||
'type': datetime,
|
'type': datetime,
|
||||||
},
|
},
|
||||||
|
'payment_term_weekdays': {
|
||||||
|
'default': 'True',
|
||||||
|
'type': bool
|
||||||
|
},
|
||||||
'payment_term_expire_automatically': {
|
'payment_term_expire_automatically': {
|
||||||
'default': 'True',
|
'default': 'True',
|
||||||
'type': bool
|
'type': bool
|
||||||
|
|||||||
@@ -204,6 +204,13 @@ class PaymentSettingsForm(SettingsForm):
|
|||||||
required=False,
|
required=False,
|
||||||
widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'})
|
widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'})
|
||||||
)
|
)
|
||||||
|
payment_term_weekdays = forms.BooleanField(
|
||||||
|
label=_('Only end payment terms on weekdays'),
|
||||||
|
help_text=_("If this is activated and the payment term of any order ends on a saturday or sunday, it will be "
|
||||||
|
"moved to the next monday instead. This is required in some countries by civil law. This will "
|
||||||
|
"not effect the last date of payments configured above."),
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
payment_term_expire_automatically = forms.BooleanField(
|
payment_term_expire_automatically = forms.BooleanField(
|
||||||
label=_('Automatically expire unpaid orders'),
|
label=_('Automatically expire unpaid orders'),
|
||||||
help_text=_("If checked, all unpaid orders will automatically go from 'pending' to 'expired' "
|
help_text=_("If checked, all unpaid orders will automatically go from 'pending' to 'expired' "
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<legend>{% trans "Payment settings" %}</legend>
|
<legend>{% trans "Payment settings" %}</legend>
|
||||||
{% bootstrap_field sform.payment_term_days layout="horizontal" %}
|
{% bootstrap_field sform.payment_term_days layout="horizontal" %}
|
||||||
{% bootstrap_field sform.payment_term_last layout="horizontal" %}
|
{% bootstrap_field sform.payment_term_last layout="horizontal" %}
|
||||||
|
{% bootstrap_field sform.payment_term_weekdays layout="horizontal" %}
|
||||||
{% bootstrap_field sform.payment_term_expire_automatically layout="horizontal" %}
|
{% bootstrap_field sform.payment_term_expire_automatically layout="horizontal" %}
|
||||||
{% bootstrap_field sform.payment_term_accept_late layout="horizontal" %}
|
{% bootstrap_field sform.payment_term_accept_late layout="horizontal" %}
|
||||||
{% bootstrap_field sform.tax_rate_default layout="horizontal" %}
|
{% bootstrap_field sform.tax_rate_default layout="horizontal" %}
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
from datetime import timedelta
|
from datetime import datetime, timedelta
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from django.db import transaction
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import make_aware, now
|
||||||
|
|
||||||
from pretix.base.decimal import round_decimal
|
from pretix.base.decimal import round_decimal
|
||||||
from pretix.base.models import (
|
from pretix.base.models import Event, Item, Order, OrderPosition, Organizer
|
||||||
Event, Item, Order, OrderPosition, Organizer, Quota,
|
|
||||||
)
|
|
||||||
from pretix.base.payment import FreeOrderProvider
|
from pretix.base.payment import FreeOrderProvider
|
||||||
from pretix.base.services import invoices
|
|
||||||
from pretix.base.services.orders import (
|
from pretix.base.services.orders import (
|
||||||
OrderChangeManager, OrderError, _create_order, expire_orders,
|
OrderChangeManager, OrderError, _create_order, expire_orders,
|
||||||
)
|
)
|
||||||
@@ -31,16 +27,37 @@ def event():
|
|||||||
def test_expiry_days(event):
|
def test_expiry_days(event):
|
||||||
today = now()
|
today = now()
|
||||||
event.settings.set('payment_term_days', 5)
|
event.settings.set('payment_term_days', 5)
|
||||||
|
event.settings.set('payment_term_weekdays', False)
|
||||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||||
now_dt=today, payment_provider=FreeOrderProvider(event),
|
now_dt=today, payment_provider=FreeOrderProvider(event),
|
||||||
locale='de')
|
locale='de')
|
||||||
assert (order.expires - today).days == 5
|
assert (order.expires - today).days == 5
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_expiry_weekdays(event):
|
||||||
|
today = make_aware(datetime(2016, 9, 20, 15, 0, 0, 0))
|
||||||
|
event.settings.set('payment_term_days', 5)
|
||||||
|
event.settings.set('payment_term_weekdays', True)
|
||||||
|
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||||
|
now_dt=today, payment_provider=FreeOrderProvider(event),
|
||||||
|
locale='de')
|
||||||
|
assert (order.expires - today).days == 6
|
||||||
|
assert order.expires.weekday() == 0
|
||||||
|
|
||||||
|
today = make_aware(datetime(2016, 9, 19, 15, 0, 0, 0))
|
||||||
|
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||||
|
now_dt=today, payment_provider=FreeOrderProvider(event),
|
||||||
|
locale='de')
|
||||||
|
assert (order.expires - today).days == 7
|
||||||
|
assert order.expires.weekday() == 0
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_expiry_last(event):
|
def test_expiry_last(event):
|
||||||
today = now()
|
today = now()
|
||||||
event.settings.set('payment_term_days', 5)
|
event.settings.set('payment_term_days', 5)
|
||||||
|
event.settings.set('payment_term_weekdays', False)
|
||||||
event.settings.set('payment_term_last', now() + timedelta(days=3))
|
event.settings.set('payment_term_last', now() + timedelta(days=3))
|
||||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||||
now_dt=today, payment_provider=FreeOrderProvider(event),
|
now_dt=today, payment_provider=FreeOrderProvider(event),
|
||||||
|
|||||||
Reference in New Issue
Block a user