Stripe: Do not duplicate refunds of migrated payments

This commit is contained in:
Raphael Michel
2018-09-03 15:20:05 +02:00
parent cf6b6c129a
commit 6c5cff6162

View File

@@ -233,16 +233,29 @@ def charge_webhook(event, event_json, charge_id, rso):
is_refund = charge['refunds']['total_count'] or charge['dispute'] is_refund = charge['refunds']['total_count'] or charge['dispute']
if is_refund: if is_refund:
known_refunds = [r.info_data.get('id') for r in payment.refunds.all()] known_refunds = [r.info_data.get('id') for r in payment.refunds.all()]
migrated_refund_amounts = [r.amount for r in payment.refunds.all() if not r.info_data.get('id')]
for r in charge['refunds']['data']: for r in charge['refunds']['data']:
a = prov._amount_to_decimal(r['amount'])
if r['status'] in ('failed', 'canceled'):
continue
if a in migrated_refund_amounts:
migrated_refund_amounts.remove(a)
continue
if r['id'] not in known_refunds: if r['id'] not in known_refunds:
payment.create_external_refund( payment.create_external_refund(
amount=prov._amount_to_decimal(r['amount']), amount=a,
info=str(r) info=str(r)
) )
if charge['dispute']: if charge['dispute']:
if charge['dispute']['status'] != 'won' and charge['dispute']['id'] not in known_refunds: if charge['dispute']['status'] != 'won' and charge['dispute']['id'] not in known_refunds:
a = prov._amount_to_decimal(charge['dispute']['amount'])
if a in migrated_refund_amounts:
migrated_refund_amounts.remove(a)
else:
payment.create_external_refund( payment.create_external_refund(
amount=prov._amount_to_decimal(charge['dispute']['amount']), amount=a,
info=str(charge['dispute']) info=str(charge['dispute'])
) )
elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED): elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED):