diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 98fc0d25e6..07e90c804c 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -931,6 +931,21 @@ class OrderChangeManager: if self.order.pending_sum <= Decimal('0.00'): self.order.status = Order.STATUS_PAID self.order.save() + elif self.open_payment: + self.open_payment.state = OrderPayment.PAYMENT_STATE_CANCELED + self.open_payment.save() + self.order.log_action('pretix.event.order.payment.canceled', { + 'local_id': self.open_payment.local_id, + 'provider': self.open_payment.provider, + }, user=self.user, auth=self.auth) + elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff > 0: + if self.open_payment: + self.open_payment.state = OrderPayment.PAYMENT_STATE_CANCELED + self.open_payment.save() + self.order.log_action('pretix.event.order.payment.canceled', { + 'local_id': self.open_payment.local_id, + 'provider': self.open_payment.provider, + }, user=self.user, auth=self.auth) def _check_paid_to_free(self): if self.order.total == 0 and (self._totaldiff < 0 or (self.split_order and self.split_order.total > 0)): diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index a226751b25..0edc45462e 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -1103,6 +1103,18 @@ class OrderChangeManagerTests(TestCase): assert o2.invoice_address != ia assert o2.invoice_address.company == 'Sample' + def test_change_price_of_pending_order_with_payment(self): + self.order.status = Order.STATUS_PENDING + self.order.save() + assert self.order.payments.last().state == OrderPayment.PAYMENT_STATE_CREATED + assert self.order.payments.last().amount == Decimal('46.00') + + self.ocm.change_price(self.op1, Decimal('27.00')) + self.ocm.commit() + + assert self.order.payments.last().state == OrderPayment.PAYMENT_STATE_CANCELED + assert self.order.payments.last().amount == Decimal('46.00') + def test_split_reverse_charge(self): ia = self._enable_reverse_charge()