Orders: Add bulk action to refund overpaid amount (#3721)

* add bulk action to refund overpaid amount

* display number of successful actions, use existing annotate method

* add tests, address review comments

* lint
This commit is contained in:
Julian Baumann
2023-11-23 09:48:28 +01:00
committed by GitHub
parent b639ac850f
commit 8c80200fc0
4 changed files with 93 additions and 2 deletions

View File

@@ -277,3 +277,50 @@ def test_order_bulk_delete_ignore_wrong_state(client, env, order1, order2):
with scopes_disabled():
assert Order.objects.get() == order2
@pytest.mark.django_db
def test_order_bulk_overpaid_refund_explicit_id(client, env, order1, order2):
client.login(email='dummy@dummy.dummy', password='dummy')
with scopes_disabled():
payment1 = order1.payments.first()
payment1.state = OrderPayment.PAYMENT_STATE_CONFIRMED
payment1.info_data = {"payer": "Dummy Dummy", "iban": "DE02120300000000202051"}
payment1.save()
order1.payments.create(
amount=2, provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CONFIRMED
)
_run_bulk_action(client, 'refund_overpaid', {'order': order1.pk}, {'operation': 'confirm'})
order1.refresh_from_db()
order2.refresh_from_db()
with scopes_disabled():
assert order1.refunds.exists()
assert order1.refunds.get().amount == Decimal('2.00')
@pytest.mark.django_db
def test_order_bulk_overpaid_refund_ignores_non_refundable(client, env, order1, order2):
client.login(email='dummy@dummy.dummy', password='dummy')
with scopes_disabled():
o1_payment1 = order1.payments.first()
o1_payment1.state = OrderPayment.PAYMENT_STATE_CONFIRMED
o1_payment1.save()
order1.payments.create(
amount=2, provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CONFIRMED
)
o2_payment1 = order1.payments.first()
o2_payment1.provider = "manual"
o2_payment1.save()
order2.payments.create(
amount=2, provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CONFIRMED
)
_run_bulk_action(client, 'refund_overpaid', {'__ALL': 'on'}, {'operation': 'confirm'})
order1.refresh_from_db()
order2.refresh_from_db()
with scopes_disabled():
assert not order1.refunds.exists()
assert not order2.refunds.exists()