Allow to set a custom payment date for manual payments

This commit is contained in:
Raphael Michel
2019-05-16 11:21:00 +02:00
parent 6c582b8f8c
commit c7774dfdb8
4 changed files with 21 additions and 5 deletions

View File

@@ -1172,7 +1172,8 @@ class OrderPayment(models.Model):
self.order.log_action('pretix.event.order.overpaid', {}, user=user, auth=auth) self.order.log_action('pretix.event.order.overpaid', {}, user=user, auth=auth)
order_paid.send(self.order.event, order=self.order) order_paid.send(self.order.event, order=self.order)
def confirm(self, count_waitinglist=True, send_mail=True, force=False, user=None, auth=None, mail_text='', ignore_date=False, lock=True): def confirm(self, count_waitinglist=True, send_mail=True, force=False, user=None, auth=None, mail_text='',
ignore_date=False, lock=True, payment_date=None):
""" """
Marks the payment as complete. If possible, this also marks the order as paid if no further Marks the payment as complete. If possible, this also marks the order as paid if no further
payment is required payment is required
@@ -1203,7 +1204,7 @@ class OrderPayment(models.Model):
return return
locked_instance.state = self.PAYMENT_STATE_CONFIRMED locked_instance.state = self.PAYMENT_STATE_CONFIRMED
locked_instance.payment_date = now() locked_instance.payment_date = payment_date or now()
locked_instance.info = self.info # required for backwards compatibility locked_instance.info = self.info # required for backwards compatibility
locked_instance.save(update_fields=['state', 'payment_date', 'info']) locked_instance.save(update_fields=['state', 'payment_date', 'info'])

View File

@@ -9,6 +9,7 @@ from django.utils.timezone import now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from pretix.base.forms import I18nModelForm, PlaceholderValidator from pretix.base.forms import I18nModelForm, PlaceholderValidator
from pretix.base.forms.widgets import DatePickerWidget
from pretix.base.models import InvoiceAddress, ItemAddOn, Order, OrderPosition from pretix.base.models import InvoiceAddress, ItemAddOn, Order, OrderPosition
from pretix.base.models.event import SubEvent from pretix.base.models.event import SubEvent
from pretix.base.services.pricing import get_price from pretix.base.services.pricing import get_price
@@ -116,6 +117,12 @@ class MarkPaidForm(ConfirmPaymentForm):
localize=True, localize=True,
label=_('Payment amount'), label=_('Payment amount'),
) )
payment_date = forms.DateField(
required=True,
label=_('Payment date'),
widget=DatePickerWidget(),
initial=now
)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

View File

@@ -23,6 +23,7 @@
<input type="hidden" name="status" value="p" /> <input type="hidden" name="status" value="p" />
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
{% bootstrap_field form.amount layout='horizontal' %} {% bootstrap_field form.amount layout='horizontal' %}
{% bootstrap_field form.payment_date layout='horizontal' %}
{% if form.force %} {% if form.force %}
{% bootstrap_field form.force layout='horizontal' horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %} {% bootstrap_field form.force layout='horizontal' horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %}
{% endif %} {% endif %}

View File

@@ -3,7 +3,7 @@ import logging
import mimetypes import mimetypes
import os import os
import re import re
from datetime import timedelta from datetime import datetime, time, timedelta
from decimal import Decimal, DecimalException from decimal import Decimal, DecimalException
import pytz import pytz
@@ -24,7 +24,7 @@ from django.utils import formats
from django.utils.formats import date_format from django.utils.formats import date_format
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.http import is_safe_url from django.utils.http import is_safe_url
from django.utils.timezone import now from django.utils.timezone import make_aware, now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import ( from django.views.generic import (
DetailView, FormView, ListView, TemplateView, View, DetailView, FormView, ListView, TemplateView, View,
@@ -862,8 +862,15 @@ class OrderTransition(OrderView):
fee=None fee=None
) )
payment_date = None
if self.mark_paid_form.cleaned_data['payment_date'] != now().date():
payment_date = make_aware(datetime.combine(
self.mark_paid_form.cleaned_data['payment_date'],
time(hour=0, minute=0, second=0)
), self.order.event.timezone)
try: try:
p.confirm(user=self.request.user, count_waitinglist=False, p.confirm(user=self.request.user, count_waitinglist=False, payment_date=payment_date,
force=self.mark_paid_form.cleaned_data.get('force', False)) force=self.mark_paid_form.cleaned_data.get('force', False))
except Quota.QuotaExceededException as e: except Quota.QuotaExceededException as e:
p.state = OrderPayment.PAYMENT_STATE_FAILED p.state = OrderPayment.PAYMENT_STATE_FAILED