diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 19c10054e..cf460b97f 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -922,12 +922,13 @@ class OrderChangeManager: def _check_paid_price_change(self): if self.order.status == Order.STATUS_PAID and self._totaldiff > 0: - self.order.status = Order.STATUS_PENDING - self.order.set_expires( - now(), - self.order.event.subevents.filter(id__in=self.order.positions.values_list('subevent_id', flat=True)) - ) - self.order.save() + if self.order.pending_sum > Decimal('0.00'): + self.order.status = Order.STATUS_PENDING + self.order.set_expires( + now(), + self.order.event.subevents.filter(id__in=self.order.positions.values_list('subevent_id', flat=True)) + ) + self.order.save() elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff < 0: if self.order.pending_sum <= Decimal('0.00'): self.order.status = Order.STATUS_PAID diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 8ec06dc11..2d07aa460 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -777,6 +777,27 @@ class OrderChangeManagerTests(TestCase): assert self.order.pending_sum == Decimal('2.00') assert self.order.status == Order.STATUS_PENDING + def test_change_paid_stays_paid_when_overpaid(self): + self.order.status = Order.STATUS_PAID + self.order.save() + self.order.payments.create( + provider='manual', + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + amount=self.order.total, + ) + self.order.payments.create( + provider='manual', + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + amount=Decimal('2.00'), + ) + assert self.order.pending_sum == Decimal('-2.00') + self.ocm.change_price(self.op1, Decimal('25.00')) + self.ocm.commit() + self.order.refresh_from_db() + assert self.order.total == Decimal('48.00') + assert self.order.pending_sum == Decimal('0.00') + assert self.order.status == Order.STATUS_PAID + def test_add_item_quota_required(self): self.quota.delete() with self.assertRaises(OrderError):