diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 9b7a97997..42c5f48d6 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -386,7 +386,7 @@ Your {event} team""")) 'type': LazyI18nString, 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, -we did not yet receive a payment for your order for {event}. +we did not yet receive a full payment for your order for {event}. Please keep in mind that we only guarantee your order if we receive your payment before {expire_date}. diff --git a/src/pretix/plugins/banktransfer/tasks.py b/src/pretix/plugins/banktransfer/tasks.py index a96225057..3b0a035f7 100644 --- a/src/pretix/plugins/banktransfer/tasks.py +++ b/src/pretix/plugins/banktransfer/tasks.py @@ -2,18 +2,23 @@ import logging import re from decimal import Decimal +import pytz from celery.exceptions import MaxRetriesExceededError from django.conf import settings from django.db import transaction from django.db.models import Q -from django.utils.translation import ugettext_noop +from django.utils.formats import date_format +from django.utils.translation import ugettext, ugettext_noop from pretix.base.i18n import language -from pretix.base.models import Event, Order, OrderPayment, Organizer, Quota +from pretix.base.models import ( + Event, InvoiceAddress, Order, OrderPayment, Organizer, Quota, +) from pretix.base.services.locking import LockTimeoutException from pretix.base.services.mail import SendMailException from pretix.base.services.tasks import TransactionAwareTask from pretix.celery_app import app +from pretix.multidomain.urlreverse import build_absolute_uri from .models import BankImportJob, BankTransaction @@ -88,6 +93,40 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or provider='banktransfer', state__in=(OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING), ).update(state=OrderPayment.PAYMENT_STATE_CANCELED) + + o = trans.order + o.refresh_from_db() + if o.pending_sum > Decimal('0.00') and o.status == Order.STATUS_PENDING: + print("send mail") + with language(o.locale): + tz = pytz.timezone(o.event.settings.get('timezone', settings.TIME_ZONE)) + try: + invoice_name = o.invoice_address.name + invoice_company = o.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" + email_template = o.event.settings.mail_text_order_expire_warning + email_context = { + 'event': o.event.name, + 'url': build_absolute_uri(o.event, 'presale:event.order', kwargs={ + 'order': o.code, + 'secret': o.secret + }), + 'expire_date': date_format(o.expires.astimezone(tz), 'SHORT_DATE_FORMAT'), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, + } + email_subject = ugettext('Your order received an incomplete payment: %(code)s') % {'code': o.code} + + try: + o.send_mail( + email_subject, email_template, email_context, + 'pretix.event.order.email.expire_warning_sent' + ) + except SendMailException: + logger.exception('Reminder email could not be sent') + trans.save() diff --git a/src/tests/plugins/banktransfer/test_import.py b/src/tests/plugins/banktransfer/test_import.py index b945371be..af9662bfa 100644 --- a/src/tests/plugins/banktransfer/test_import.py +++ b/src/tests/plugins/banktransfer/test_import.py @@ -3,6 +3,7 @@ from decimal import Decimal import pytest from bs4 import BeautifulSoup +from django.core import mail as djmail from django.core.files.uploadedfile import SimpleUploadedFile from django.utils.timezone import now @@ -26,7 +27,7 @@ def env(): t.members.add(user) t.limit_events.add(event) o1 = Order.objects.create( - code='1Z3AS', event=event, + code='1Z3AS', event=event, email='admin@localhost', status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10), total=23 @@ -100,6 +101,7 @@ def orga_job(env): @pytest.mark.django_db def test_mark_paid(env, job): + djmail.outbox = [] process_banktransfers(job, [{ 'payer': 'Karla Kundin', 'reference': 'Bestellung DUMMY1234S', @@ -108,10 +110,13 @@ def test_mark_paid(env, job): }]) env[2].refresh_from_db() assert env[2].status == Order.STATUS_PAID + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].subject == 'Payment received for your order: 1Z3AS' @pytest.mark.django_db def test_underpaid(env, job): + djmail.outbox = [] process_banktransfers(job, [{ 'payer': 'Karla Kundin', 'reference': 'Bestellung DUMMY1Z3AS', @@ -125,6 +130,9 @@ def test_underpaid(env, job): assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED assert env[2].pending_sum == Decimal('0.50') + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].subject == 'Your order received an incomplete payment: 1Z3AS' + @pytest.mark.django_db def test_in_parts(env, job):