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)
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
payment is required
@@ -1203,7 +1204,7 @@ class OrderPayment(models.Model):
return
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.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 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.event import SubEvent
from pretix.base.services.pricing import get_price
@@ -116,6 +117,12 @@ class MarkPaidForm(ConfirmPaymentForm):
localize=True,
label=_('Payment amount'),
)
payment_date = forms.DateField(
required=True,
label=_('Payment date'),
widget=DatePickerWidget(),
initial=now
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

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

View File

@@ -3,7 +3,7 @@ import logging
import mimetypes
import os
import re
from datetime import timedelta
from datetime import datetime, time, timedelta
from decimal import Decimal, DecimalException
import pytz
@@ -24,7 +24,7 @@ from django.utils import formats
from django.utils.formats import date_format
from django.utils.functional import cached_property
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.views.generic import (
DetailView, FormView, ListView, TemplateView, View,
@@ -862,8 +862,15 @@ class OrderTransition(OrderView):
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:
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))
except Quota.QuotaExceededException as e:
p.state = OrderPayment.PAYMENT_STATE_FAILED