diff --git a/src/pretix/base/services/cancelevent.py b/src/pretix/base/services/cancelevent.py index 863534d82d..b493a6f2df 100644 --- a/src/pretix/base/services/cancelevent.py +++ b/src/pretix/base/services/cancelevent.py @@ -150,8 +150,6 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_ for o in orders_to_cancel.only('id', 'total'): try: - refund_amount = Decimal('0.00') - fee = Decimal('0.00') if keep_fees: fee += o.fees.filter( @@ -167,6 +165,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_ fee = round_decimal(min(fee, o.payment_refund_sum), event.currency) _cancel_order(o.pk, user, send_mail=False, cancellation_fee=fee) + refund_amount = o.payment_refund_sum + if auto_refund: _try_auto_refund(o.pk) @@ -182,7 +182,6 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_ for o in orders_to_change.values_list('id', flat=True): with transaction.atomic(): o = event.orders.select_for_update().get(pk=o) - refund_amount = Decimal('0.00') total = Decimal('0.00') positions = [] @@ -210,6 +209,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_ ocm.add_fee(f) ocm.commit() + refund_amount = o.payment_refund_sum - o.total + if auto_refund: _try_auto_refund(o.pk) diff --git a/src/tests/base/test_cancelevent.py b/src/tests/base/test_cancelevent.py index 081671b56f..3ac91ac695 100644 --- a/src/tests/base/test_cancelevent.py +++ b/src/tests/base/test_cancelevent.py @@ -43,15 +43,25 @@ class EventCancelTests(TestCase): @classscope(attr='o') def test_cancel_send_mail(self): + gc = self.o.issued_gift_cards.create(currency="EUR") + self.order.payments.create( + amount=Decimal('46.00'), + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + provider='giftcard', + info='{"gift_card": %d}' % gc.pk + ) + self.order.status = Order.STATUS_PAID + self.order.save() cancel_event( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", - keep_fees=True, send=True, send_subject="Event canceled", send_message="Event canceled :-(", + keep_fees=True, send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", user=None ) assert len(djmail.outbox) == 1 self.order.refresh_from_db() assert self.order.status == Order.STATUS_CANCELED + assert '46.00' in djmail.outbox[0].body @classscope(attr='o') def test_cancel_send_mail_attendees(self): @@ -265,16 +275,24 @@ class SubEventCancelTests(TestCase): @classscope(attr='o') def test_cancel_mixed_order(self): + gc = self.o.issued_gift_cards.create(currency="EUR") + self.order.payments.create( + amount=Decimal('46.00'), + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + provider='giftcard', + info='{"gift_card": %d}' % gc.pk + ) + self.order.status = Order.STATUS_PAID + self.order.save() cancel_event( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", - keep_fees=True, send=True, send_subject="Event canceled", send_message="Event canceled :-(", + keep_fees=True, send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", user=None ) self.order.refresh_from_db() - assert self.order.status == Order.STATUS_PENDING - assert self.order.positions.filter(subevent=self.se2).count() == 1 - assert self.order.positions.filter(subevent=self.se1).count() == 0 + assert self.order.status == Order.STATUS_PAID + assert '23.00' in djmail.outbox[0].body @classscope(attr='o') def test_cancel_partially_keep_fees(self):