From 27a32173e602ee08e1a5221c4eddfd3915b21fca Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 4 Oct 2019 16:47:23 +0200 Subject: [PATCH] Move more code into change_payment_provider --- src/pretix/base/services/orders.py | 32 ++++++++++++++++++++++-- src/pretix/plugins/banktransfer/tasks.py | 5 ++-- src/pretix/presale/views/order.py | 26 ++----------------- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 376aca5c63..7ad24f460e 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1684,7 +1684,9 @@ def cancel_order(self, order: int, user: int=None, send_mail: bool=True, api_tok raise OrderError(error_messages['busy']) -def change_payment_provider(order: Order, payment_provider, amount=None, new_payment=None): +def change_payment_provider(order: Order, payment_provider, amount=None, new_payment=None, create_log=True, + recreate_invoices=True): + oldtotal = order.total e = OrderPayment.objects.filter(fee=OuterRef('pk'), state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED)) open_fees = list( @@ -1730,4 +1732,30 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay order.total = (order.positions.aggregate(sum=Sum('price'))['sum'] or 0) + (order.fees.aggregate(sum=Sum('value'))['sum'] or 0) order.save(update_fields=['total']) - return old_fee, new_fee, fee + + if not new_payment: + new_payment = order.payments.create( + state=OrderPayment.PAYMENT_STATE_CREATED, + provider=payment_provider.identifier, + amount=order.pending_sum, + fee=fee + ) + if create_log and new_payment: + order.log_action( + 'pretix.event.order.payment.changed' if open_payment else 'pretix.event.order.payment.started', + { + 'fee': new_fee, + 'old_fee': old_fee, + 'provider': payment_provider.identifier, + 'payment': new_payment.pk, + 'local_id': new_payment.local_id, + } + ) + + if recreate_invoices: + i = order.invoices.filter(is_cancellation=False).last() + if i and order.total != oldtotal: + generate_cancellation(i) + generate_invoice(order) + + return old_fee, new_fee, fee, new_payment diff --git a/src/pretix/plugins/banktransfer/tasks.py b/src/pretix/plugins/banktransfer/tasks.py index 356fcbff81..4b41e11307 100644 --- a/src/pretix/plugins/banktransfer/tasks.py +++ b/src/pretix/plugins/banktransfer/tasks.py @@ -119,8 +119,9 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or } if created: - # We're perform a payment method switchign on-demand here - old_fee, new_fee, fee = change_payment_provider(trans.order, p.payment_provider, p.amount, new_payment=p) # noqa + # We're perform a payment method switching on-demand here + old_fee, new_fee, fee, p = change_payment_provider(trans.order, p.payment_provider, p.amount, + new_payment=p, create_log=False) # noqa if fee: p.fee = fee p.save(update_fields=['fee']) diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index ead3d74ac8..4c4845fadf 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -25,8 +25,7 @@ from pretix.base.models.orders import ( ) from pretix.base.payment import PaymentException from pretix.base.services.invoices import ( - generate_cancellation, generate_invoice, invoice_pdf, invoice_pdf_task, - invoice_qualified, + generate_invoice, invoice_pdf, invoice_pdf_task, invoice_qualified, ) from pretix.base.services.mail import SendMailException from pretix.base.services.orders import cancel_order, change_payment_provider @@ -543,34 +542,13 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView): def post(self, request, *args, **kwargs): self.request = request - oldtotal = self.order.total for p in self.provider_forms: if p['provider'].identifier == request.POST.get('payment', ''): request.session['payment'] = p['provider'].identifier request.session['payment_change_{}'.format(self.order.pk)] = '1' with transaction.atomic(): - old_fee, new_fee, fee = change_payment_provider(self.order, p['provider'], None) - newpayment = self.order.payments.create( - state=OrderPayment.PAYMENT_STATE_CREATED, - provider=p['provider'].identifier, - amount=self.order.pending_sum, - fee=fee - ) - self.order.log_action( - 'pretix.event.order.payment.changed' if self.open_payment else 'pretix.event.order.payment.started', - { - 'fee': new_fee, - 'old_fee': old_fee, - 'provider': newpayment.provider, - 'payment': newpayment.pk, - 'local_id': newpayment.local_id, - } - ) - i = self.order.invoices.filter(is_cancellation=False).last() - if i and self.order.total != oldtotal: - generate_cancellation(i) - generate_invoice(self.order) + old_fee, new_fee, fee, newpayment = change_payment_provider(self.order, p['provider'], None) resp = p['provider'].payment_prepare(request, newpayment) if isinstance(resp, str):