forked from CGM_Public/pretix_original
Move more code into change_payment_provider
This commit is contained in:
@@ -1684,7 +1684,9 @@ def cancel_order(self, order: int, user: int=None, send_mail: bool=True, api_tok
|
|||||||
raise OrderError(error_messages['busy'])
|
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,
|
e = OrderPayment.objects.filter(fee=OuterRef('pk'), state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||||
OrderPayment.PAYMENT_STATE_REFUNDED))
|
OrderPayment.PAYMENT_STATE_REFUNDED))
|
||||||
open_fees = list(
|
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.total = (order.positions.aggregate(sum=Sum('price'))['sum'] or 0) + (order.fees.aggregate(sum=Sum('value'))['sum'] or 0)
|
||||||
order.save(update_fields=['total'])
|
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
|
||||||
|
|||||||
@@ -119,8 +119,9 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or
|
|||||||
}
|
}
|
||||||
|
|
||||||
if created:
|
if created:
|
||||||
# We're perform a payment method switchign on-demand here
|
# We're perform a payment method switching on-demand here
|
||||||
old_fee, new_fee, fee = change_payment_provider(trans.order, p.payment_provider, p.amount, new_payment=p) # noqa
|
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:
|
if fee:
|
||||||
p.fee = fee
|
p.fee = fee
|
||||||
p.save(update_fields=['fee'])
|
p.save(update_fields=['fee'])
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ from pretix.base.models.orders import (
|
|||||||
)
|
)
|
||||||
from pretix.base.payment import PaymentException
|
from pretix.base.payment import PaymentException
|
||||||
from pretix.base.services.invoices import (
|
from pretix.base.services.invoices import (
|
||||||
generate_cancellation, generate_invoice, invoice_pdf, invoice_pdf_task,
|
generate_invoice, invoice_pdf, invoice_pdf_task, invoice_qualified,
|
||||||
invoice_qualified,
|
|
||||||
)
|
)
|
||||||
from pretix.base.services.mail import SendMailException
|
from pretix.base.services.mail import SendMailException
|
||||||
from pretix.base.services.orders import cancel_order, change_payment_provider
|
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):
|
def post(self, request, *args, **kwargs):
|
||||||
self.request = request
|
self.request = request
|
||||||
oldtotal = self.order.total
|
|
||||||
for p in self.provider_forms:
|
for p in self.provider_forms:
|
||||||
if p['provider'].identifier == request.POST.get('payment', ''):
|
if p['provider'].identifier == request.POST.get('payment', ''):
|
||||||
request.session['payment'] = p['provider'].identifier
|
request.session['payment'] = p['provider'].identifier
|
||||||
request.session['payment_change_{}'.format(self.order.pk)] = '1'
|
request.session['payment_change_{}'.format(self.order.pk)] = '1'
|
||||||
|
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
old_fee, new_fee, fee = change_payment_provider(self.order, p['provider'], None)
|
old_fee, new_fee, fee, newpayment = 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)
|
|
||||||
|
|
||||||
resp = p['provider'].payment_prepare(request, newpayment)
|
resp = p['provider'].payment_prepare(request, newpayment)
|
||||||
if isinstance(resp, str):
|
if isinstance(resp, str):
|
||||||
|
|||||||
Reference in New Issue
Block a user